import { message } from 'ant-design-vue';
/** 文件后缀集合 */
export function fileTypeAll() {
  return {
    res: ['res'], // 平台授权文件类型
    text: ['txt', 'js', 'jsp', 'java', 'css', 'sql', 'ini', 'conf'],
    code: ['xml', 'html', 'htm'],
    word: ['doc', 'docx', 'wps'],
    excel: ['xls', 'xlsx', 'et'],
    ppt: ['ppt', 'pptx', 'dps'],
    pdf: ['pdf'],
    zip: ['zip', 'rar', 'tar', 'gz', 'cab', 'uue', 'arj', 'bz2', 'lzh', 'jar', 'ace', 'iso', '7z', 'z'],
    image: ['bmp', 'dib', 'gif', 'jfif', 'pjpeg', 'jpeg', 'pjp', 'jpg', 'png', 'tiff', 'tif', 'webp', 'psd', 'pic', 'svg'],
    video: ['rm', 'avi', 'mp4', 'mpg', 'mov', 'swf'],
    audio: ['wav', 'mp3', 'aif', 'au', 'ram', 'wma', 'mmf', 'amr', 'aac', 'flac']
  };
}
/** 浏览器可选类型 */
export function fileAcceptTypeAll() {
  return {
    code: ['text/xml, application/xml', 'text/html', 'text/html'],
    word: ['application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-works'],
    excel: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
    ppt: ['application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
    pdf: ['application/pdf'],
    image: ['image/bmp', 'image/gif', 'image/jpg', 'image/jpeg', 'image/png', 'image/tiff', '.psd', '.pic', '.svg', 'image/webp']
  };
}

/**
 * 动态创建正则表达式，验证文件后缀
 * @param {*} fileType 文件类型
 * @returns
 */
export function createRegExp(fileType) {
  if (fileType && fileType.length > 0) {
    const reg = fileType.join('|');
    const regexp = new RegExp(`(${reg})$`);
    return regexp;
  }
  return null;
}
/**
 * 获取文件后缀
 * @param {*} fileName 文件名称
 * @returns
 */
export function getFileExtension(fileName) {
  if (fileName) {
    const patternFileExtension = /\.([0-9a-z]+)(?:[?#]|$)/i;
    return fileName.match(patternFileExtension);
  }
  return '';
}

/**
 * 校验表单附件密级
 * @param {*} uploadFileRef 附件上传组件Ref
 * @param {*} secretLevel 密级
 * @returns
 */
export function validateUploaderFileSecret(uploadFileRef, secretLevel) {
  const fileElements = Object.keys(uploadFileRef);
  for (let i = 0; i < fileElements.length; i++) {
    const errorMessage = uploadFileRef[fileElements[i]].value?.validateUploaderFileSecret(secretLevel);
    if (errorMessage) {
      return false;
    }
  }
  return true;
}

/**
 * 校验密级并上传同一表单中的多个附件区域的文件
 *
 * 此函数负责处理多个文件元素的上传过程它接受一个配置对象作为参数，该对象包含上传器实例映射、表单ID、
 * 密级、成功回调函数和错误回调函数通过调用内部的handleMultipleFileUpload函数来执行文件上传
 *
 * @param {Object} uploaderInstances - 文件上传器实例的映射对象,包含一个或多个附件上传组件实例
 * @param {string} formId - 表单的唯一标识符
 * @param {string} secretLevel - 文件的密级
 * @param {Function} onSuccess - 文件上传成功后的回调函数
 * @param {Function} onError - 文件上传失败后的回调函数
 * @returns {Promise<{ successFiles?: any[]; errorFiles?: any[]; elementId: string; }>[]}
 */
export function uploadMultipleFileElements({ uploaderInstances, formId, secretLevel, onSuccess, onError }) {
  return handleMultipleFileUpload(uploaderInstances, formId, secretLevel, onSuccess, onError);
}

/**
 * 多附件密级校验并上传
 * @deprecated
 * @param {*} uploaderInstanceMap 包含一个或多个附件上传组件实例的对象
 * @param {*} formId 表单id
 * @param {*} secretLevel 密级
 * @param {*} onSuccess 成功回调
 * @param {*} onError 失败回调
 * @returns
 */
// eslint-disable-next-line max-params
export function handleMultipleFileUpload(uploaderInstanceMap, formId, secretLevel, onSuccess, onError) {
  // 附件密级校验
  const validateResult = validateUploaderFileSecret(uploaderInstanceMap, secretLevel);
  if (!validateResult) {
    return Promise.reject('密级校验失败！');
  }
  // const promises: Promise<{ successFiles?: any[]; errorFiles?: any[]; elementId: string; }>[] = [];
  const promises = [];
  Object.values(uploaderInstanceMap).forEach((uploadFileRef) => {
    uploadFileRef.value && promises.push(uploadFileRef.value?.syncUpload(formId));
  });
  return Promise.all(promises)
    .then((result) => {
      // 检验是否存在附件上传失败的附件区域
      if (result?.filter(({ errorFiles }) => errorFiles?.length > 0)?.length) {
        const errorFileNames = result
          .map(({ errorFiles }) => errorFiles.map((file) => file.label || file.name))
          .flat()
          .filter((name) => name);
        message.error(`${errorFileNames.join(',')}上传失败，请重新上传!`);
        onError && onError({ errorFileNames, files: result });
        return;
      }
      // 所有附件都保存成功的处理
      onSuccess && onSuccess({ files: result });
    })
    .catch((error) => {
      console.error('Error handling file uploads:', error);
      message.error('文件上传过程中发生错误，请稍后再试!');
      onError && onError(error);
    });
}
